<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>symbol的使用</title>
</head>

<body>

</body>
<script>
  {
    // symbol把它当作永远都不会重复的字符串来使用
    let cz = Symbol();
    console.log(cz);

    let cy = Symbol("网址:https");
    console.log(cy.description); //获取symbol的描述
  }; {
    let cms = Symbol.for("陈观成"); //会在全局中记录这个值,只会产生一个唯一值
    let da = Symbol.keyFor(cms); //会将cms拿过做描述
  }; {
    // 使用symbol解决字符串耦合的问题
    let grade = {
      李四: {
        js: 10,
        css: 90
      },
      李四: {
        java: 100,
        "c#": 12
      }
    };

    // 使用symbol解耦
    let use1 = {
      name: "李四",
      key: Symbol()
    };

    let use2 = {
      name: "李四",
      key: Symbol()
    };
    let lai = { //要使用[]来赋值
      [use1.key]: {
        js: 89,
        hao20() {
          console.log(`解耦了...`);
        }
      },
      [use2.key]: {
        js: 100,
        laidao: 45
      }
    };

    // 取值时,使用[]
    console.log(lai[use1.key]);
  }
</script>
<script>
  // for in 和 for on 都是无法遍历symbol的

  let symbol = Symbol("无法遍历");
  let hd = {
    name: "好人",
    [symbol]: "haoren.com"
  };

  // 通过 Object.getOwnPropertySymbols()
  for (let key of Object.getOwnPropertySymbols(hd)) {
    console.log(key);
  };

  // 使用Reflect.ownKeys()遍历所有的属性
  for (let key of Reflect.ownKeys(hd)) {
    console.log(key);
  };
</script>

</html>